package com.gxa.medical.common;
//把程序出现的异常“拦截”，统一加工处理错误信息,告诉前端,AOP原理

import org.springframework.http.HttpStatus;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.List;

@RestControllerAdvice
public class GlobalExceptionHandler {
   //业务异常的原因
    @ExceptionHandler({BizException.class})
    public R handler(BizException e){
        return R.failed(e.getCode(),e.getMessage());
    }

    @ExceptionHandler({MethodArgumentNotValidException.class})
    public R handlerNotValidException(MethodArgumentNotValidException e){
//        e.printStackTrace();
        //return null;
        BindingResult bindingResult = e.getBindingResult();
// 获取所有的违反校验的错误的封装对象
        List<ObjectError> allErrors = bindingResult.getAllErrors();
// 遍历所有的Error,并拼接错误的信息
// 面试题: String/StringBuilder/StringBuffer三者的区别
        StringBuilder builder = new StringBuilder();
        allErrors.forEach(objectError -> {
            builder.append(objectError.getDefaultMessage()).append(",");
        });
// 用户的手机号不能为空,用户密码不能为空,
// 处理最后一个逗号
// substring 截取字符串的规则: [,)
        String errorMsg = builder.substring(0, builder.length() - 1);
        return R.failed(errorMsg);

    }


    //系统错误的消息，只能以日志的形式记录到日志文件，不能返给前端
    @ExceptionHandler({Exception.class})
    public R handler(Exception e){
        //在开发过程中，应该把错误信息暴露出来
        e.printStackTrace();

        return R.failed(ErrorCode.UNKNOWN_EXCEPTION.getCode(), ErrorCode.UNKNOWN_EXCEPTION.getMsg());
    }



}
